package UI;

import accesoremotoinvitado.ControladorClienteRemoto;
import accesoremotoinvitado.InvitadoInterface;
import accesoremotoservidor.CitaInterfazRemota;
import invitado.Invitado;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class FramePrincipalInvitado extends JFrame {

    static JPanel panelGlobal = new JPanel();
    static JPanel panelCentral;
    static InvitadoInterface callbackObj;
    static CitaInterfazRemota controlador;
    static JButton botonPedirCita;
    static JButton botonConsultarCita;
    static JButton botonSalir;

    static boolean esPrimerClick = true;
    static boolean esSegundoClick = false;

    public FramePrincipalInvitado() {
        //Inicialización de la ventana que contiene a programa
        super("Ventana inicio usuario invitado - Bien Raíz OK 2.0");
        setSize(700, 500);
        Image icono = Toolkit.getDefaultToolkit().getImage(getClass().getResource("../resources/logo32.png"));
        setIconImage(icono);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void resetearFrame() {
        this.remove(panelGlobal);
        this.setJMenuBar(null);
        panelGlobal = new JPanel();
        this.revalidate();
        this.repaint();
    }

    public void mostrarPantallaPrincipal() {
        this.resetearFrame();

        panelGlobal.setLayout(new GridLayout(1, 2));

        //-------Creación panel izquierdo---------------------------------------------------
        JPanel panelIzquierdo = new JPanel(new BorderLayout());

        //Se crea el panel P5 que contendrá el T1 con el saludo sobrio.
        JPanel P5 = new JPanel();
        JTextArea T1 = new JTextArea("Trabajo práctico #2 - Programación orientada a objetos.\n\nEste programa está diseñado para la administración "
                + "de una agencia de bienes raíces. En resumen, permite gestionar una pequeña base de datos que almacena información"
                + " sobre inmuebles, clientes y contratos; a través de funcionarios registrados con funciones autorizadas por un "
                + "administrador del sistema.\n\nDesarrollado por Yennifer Marcela Tobón, Juan Diego Merino, Nicolás Henao y Simón Palacio. "
                + "Estudiantes de ingeniería de sistemas e informática de la Universidad Nacional de Colombia, sede Medellín.");
        T1.setColumns(36);
        T1.setRows(4);
        T1.setLineWrap(true);
        T1.setWrapStyleWord(true);
        T1.setEditable(false);
        JScrollPane scroll = new JScrollPane(T1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        P5.add(scroll);

        //Se crea el panel P6 para el inicio de la sesión
        JPanel P6 = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        //Se crea y se ubica el label "Ingresar dirección IP del servidor a conectarse:"
        JLabel labelIP = new JLabel("Ingresar dirección IP del servidor a conectarse:");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 3;
        c.gridheight = 1;
        P6.add(labelIP, c);

        //Se crea y se ubica el cuadro de texto para ingresar la IP
        JTextField campoIP = new JTextField();
        campoIP.setColumns(12);
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 2;
        c.gridheight = 1;
        P6.add(campoIP, c);

        //Se crea y se ubica el boton conectar
        JButton botonConectar = new JButton("Conectar");
        botonConectar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    controlador = (CitaInterfazRemota) Naming.lookup("//" + campoIP.getText() + ":1099/controlador");//Se realiza la conexión con el servidor
                    callbackObj = new ControladorClienteRemoto();//Se crea el objeto que se registrará en el servidor para que éste pueda manipular al cliente
                    controlador.registrarParaCallback(callbackObj);//Se registra el objeto creado anteriormente
                    mostrarPantallaDespuesDeLaConexion();
                } catch (NotBoundException ex) {
                    JOptionPane.showMessageDialog(null, "Ingrese una IP válida", "Error de conexión", JOptionPane.ERROR_MESSAGE);
                } catch (MalformedURLException ex) {
                    JOptionPane.showMessageDialog(null, "Ingrese una IP válida", "Error de conexión", JOptionPane.ERROR_MESSAGE);
                } catch (RemoteException ex) {
                    JOptionPane.showMessageDialog(null, "El servidor no responde", "Error de conexión", JOptionPane.ERROR_MESSAGE);
                }

            }
        });
        c.fill = 1;
        c.gridx = 2;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        P6.add(botonConectar, c);

        //Se crea y se ubica el boton salir
        botonSalir = new JButton("Salir");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 3;
        c.gridheight = 1;
        P6.add(botonSalir, c);

        panelIzquierdo.add(P5, BorderLayout.NORTH);
        panelIzquierdo.add(P6, BorderLayout.CENTER);
        //-------Finaliza creación panel izquierdo---------------------------------------------------

        //-------Creación panel derecho--------------------------------------------------------------
        JPanel panelDerecho = new JPanel(new BorderLayout());

        //Se agrega el label de la bienvenida al programa
        JPanel P3 = new JPanel(new BorderLayout());
        JLabel L1 = new JLabel("<html><center>Bienvenido al sistema de Bien Raíz OK. Por favor identifíquese con su usuario y contraseña</center></html>");
        P3.add(L1, BorderLayout.CENTER);

        //Panel de imagenes        
        JPanel P4 = new JPanel(new BorderLayout());

        //Se agrega el boton gigante
        JLabel labelImagen = new JLabel("Haga clic aquí para ver fotos de Bien Raiz OK", SwingConstants.CENTER);
        labelImagen.setIcon(null);
        P4.add(labelImagen, BorderLayout.CENTER);

        panelDerecho.add(P3, BorderLayout.NORTH);
        panelDerecho.add(P4, BorderLayout.CENTER);
        //-------Finaliza creación panel derecho-------------------------------------------------------

        //Se agregan las funcionalidades
        L1.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {

            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {
                L1.setForeground(Color.red);
            }

            @Override
            public void mouseExited(MouseEvent e) {
                L1.setForeground(Color.black);
            }

        });

        P4.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if (esPrimerClick) {
                    esPrimerClick = false;
                    esSegundoClick = true;
                    Icon icono = new ImageIcon(Invitado.class.getResource("../resources/fachada.png"));
                    labelImagen.setIcon(icono);
                    labelImagen.setText("");
                } else if (esSegundoClick) {
                    esSegundoClick = false;
                    Icon icono = new ImageIcon(Invitado.class.getResource("../resources/gifInmuebles.gif"));
                    labelImagen.setIcon(icono);
                } else {
                    esPrimerClick = true;
                    labelImagen.setText("Haga clic aquí para ver fotos de Bien Raíz OK");
                    labelImagen.setIcon(null);
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }

        });
        
        botonSalir.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
       
        //Se le agregan los dos paneles al frame principal
        panelGlobal.add(panelIzquierdo);
        panelGlobal.add(panelDerecho);
        this.add(panelGlobal);
        this.revalidate();
    }

    public void mostrarPantallaDespuesDeLaConexion() {
        this.resetearFrame();
        panelGlobal.setLayout(new BorderLayout());

        //Se añaden los elementos
        JLabel titulo = new JLabel("Opciones de invitado", SwingConstants.CENTER);
        panelGlobal.add(titulo, BorderLayout.NORTH);

        panelCentral = new JPanel(new GridBagLayout());
        botonPedirCita = new JButton("Pedir una cita");
        botonConsultarCita = new JButton("Consultar mi cita");
        JButton botonDesconectar = new JButton("Desconectarse del servidor");

        panelCentral.add(botonPedirCita);
        panelCentral.add(botonConsultarCita);
        panelCentral.add(botonDesconectar);

        //Se añaden las funcionalidades
        botonPedirCita.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPantallaParaPedirUnaCita();
            }
        });

        botonConsultarCita.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPantallaParaConsultarUnaCita();
            }
        });

        botonDesconectar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    controlador.desRegistrarParaCallback(callbackObj);
                } catch (RemoteException ex) {
                    Logger.getLogger(FramePrincipalInvitado.class.getName()).log(Level.SEVERE, null, ex);
                }
                mostrarPantallaPrincipal();
                System.out.println("Desconectado correctamente");
            }
        });

        panelGlobal.add(panelCentral, BorderLayout.CENTER);
        add(panelGlobal);
        revalidate();
    }

    public void mostrarPantallaParaPedirUnaCita() {

        this.resetearFrame();
        panelGlobal.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        //Se crea y se ubica el label "cédula: "
        JLabel labelCedula = new JLabel("Cédula: ");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(labelCedula, c);

        //Se crea y se ubica el JTextField para la cédula
        JTextField campoCedula = new JTextField(10);
        c.fill = 1;
        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(campoCedula, c);

        //Se crea y se ubica el espacio para el icono de ok o de error
        JLabel labelIcono = new JLabel();
        labelIcono.setIcon(new ImageIcon("C://blank.gif"));
        c.fill = 1;
        c.gridx = 2;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(labelIcono, c);

        //Se crea y se ubica el JLabel para el "Nombre: "
        JLabel labelNombre = new JLabel("Nombre: ");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(labelNombre, c);

        //Se crea y se ubica el JTextField para el nombre
        JTextField campoNombre = new JTextField(10);
        c.fill = 1;
        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(campoNombre, c);
        add(panelGlobal);

        //Se crea y se ubica el JLabel para el "Motivo: "
        JLabel labelMotivo = new JLabel("Motivo: ");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(labelMotivo, c);

        //Se crea y se ubica el JComboBox para el motivo de la cita.
        String[] motivos = {"Arrendar", "Comprar", "Consignar"};
        JComboBox campoMotivo = new JComboBox(motivos);
        c.fill = 1;
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(campoMotivo, c);

        //Se crea y se ubica el JButton para el envío de la cita.
        botonPedirCita = new JButton("Pedir Cita");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 2;
        c.gridheight = 1;
        panelGlobal.add(botonPedirCita, c);

        //Se crea y se ubica el JButton "Volver".
        JButton botonVolver = new JButton("Volver");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 4;
        c.gridwidth = 2;
        c.gridheight = 1;
        panelGlobal.add(botonVolver, c);

        //Se añaden las funcionalidades
        campoCedula.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent fe) {
            }

            @Override
            public void focusLost(FocusEvent fe) {
                long cedulaIngresada = Long.parseLong(campoCedula.getText());
                try {
                    switch (controlador.verificarEnElSistema(cedulaIngresada)) {

                        case 0:
                            labelIcono.setIcon(new ImageIcon("C://ok.gif"));
                            labelIcono.setText("");
                            panelGlobal.revalidate();
                            break;
                        case 1:
                            labelIcono.setIcon(new ImageIcon("C://error.png"));
                            labelIcono.setText("Usted ya tiene una cita asignada");
                            labelIcono.setForeground(Color.red);
                            panelGlobal.revalidate();
                            break;
                        case 2:
                            labelIcono.setIcon(new ImageIcon("C://error.png"));
                            labelIcono.setText("Usted ya está en el sistema (byte 2)");
                            labelIcono.setForeground(Color.red);
                            panelGlobal.revalidate();
                            break;
                    }
                } catch (RemoteException ex) {
                    Logger.getLogger(FramePrincipalInvitado.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

        });

        botonPedirCita.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                long cedulaIngresada = Long.parseLong(campoCedula.getText());
                String nombreIngresado = campoNombre.getText().trim();
                byte motivo = (byte) (campoMotivo.getSelectedIndex() + 1);
                String resultadoPeticion = "";
                try {
                    resultadoPeticion = controlador.pedirUnaCita(nombreIngresado, motivo, cedulaIngresada);
                } catch (RemoteException ex) {
                    Logger.getLogger(FramePrincipalInvitado.class.getName()).log(Level.SEVERE, null, ex);
                }
                JOptionPane.showMessageDialog(null, resultadoPeticion, "Resultado de su petición", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        botonVolver.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPantallaDespuesDeLaConexion();
            }
        });

        add(panelGlobal);
        revalidate();
    }

    public void mostrarPantallaParaConsultarUnaCita() {
        this.resetearFrame();
        panelGlobal.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        //Se crea y se ubica el label "cédula: "
        JLabel labelCedula = new JLabel("Cédula: ");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(labelCedula, c);

        //Se crea y se ubica el JTextField para la cédula
        JTextField campoCedula = new JTextField(10);
        c.fill = 1;
        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        panelGlobal.add(campoCedula, c);

        //Se crea y se ubica el JButton "Consultar mi cita".
        botonConsultarCita = new JButton("Consultar mi cita");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 2;
        c.gridheight = 1;
        panelGlobal.add(botonConsultarCita, c);

        //Se crea y se ubica el JButton "Volver".
        JButton botonVolver = new JButton("Volver");
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 2;
        c.gridheight = 1;
        panelGlobal.add(botonVolver, c);

        //Se añaden las funcionalidades
        botonConsultarCita.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                long cedulaIngresada = Long.parseLong(campoCedula.getText());
                String resultadoPeticion = "";
                try {
                    resultadoPeticion = controlador.recordarCita(cedulaIngresada);
                } catch (RemoteException ex) {
                    Logger.getLogger(FramePrincipalInvitado.class.getName()).log(Level.SEVERE, null, ex);
                }
                JOptionPane.showMessageDialog(null, resultadoPeticion, "Resultado de su petición", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        botonVolver.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPantallaDespuesDeLaConexion();
            }
        });

        add(panelGlobal);
        revalidate();
    }

    public void quitarBoton(String nombreDelBoton) {
        switch (nombreDelBoton) {
            case "botonPedirCita":
                panelCentral.remove(botonPedirCita);
                break;
            case "botonConsultarCita":
                panelCentral.remove(botonConsultarCita);
                break;
        }

    }

    public void agregarBoton(String nombreDelBoton) {
        switch (nombreDelBoton) {
            case "botonPedirCita":
                panelCentral.add(botonPedirCita);
                break;
            case "botonConsultarCita":
                panelCentral.add(botonConsultarCita);
                break;
        }

    }
}
